/*	--- 状态 --- 

#	允许【一个对象】在其【内部状态改变时】改变【它的行为】。

【对象】看起来似乎修改了【它的类】。

=================================================


【状态模式】（State）经常用在【带有状态的对象】中。

什么是【状态】？

我们以【QQ聊天】为例，【一个用户的QQ】有【几种状态】：

	· 离线状态（尚未登录）；
	· 正在登录状态；
	· 在线状态；
	· 忙状态（暂时离开）。


如何表示【状态】？

我们定义【一个enum】就可以表示【不同的状态】。

但【不同的状态】需要对应【不同的行为】

比如【收到消息】时： */
if (state == ONLINUE) {
	// 闪烁图表
} else if (state == BUSY) {
	reply("现在忙,稍后回复");
} else if {
	//...
}


/*
【状态模式】的目的是为了把【上述一大串if...else...的逻辑】给【分拆】到【不同的状态类】中，使得【将来增加状态】比较容易。

例如，我们设计一个【聊天机器人】，它有【两个状态】：
	· 未连线；
	· 已连线。


对于【未连线状态】，我们【收到消息也不回复】： */
public class DisconnectedState implements State {

	public String init() {
		return "Byte!";
	}

	public String reply(String input) {
		return "";
	}
}
/*
对于【已连线状态】，我们回应【收到的消息】： */
public class ConnectedState implements State {

	public String init() {
		return "Helo, I'm Bob.";
	}

	public String reply(String input) {
		if (input.endsWith("?")) {
			return "Yes. " + input.substring(0, input.length() - 1) + "!";
		}

		if (input.endsWith(".")) {
			return input.substring(0, input.length()-1) + "!"
		}

		return input.substring(0, input.length()-1) + "?";
	}
}


/*
【状态模式】的【关键设计思想】在于【状态切换】，我们引入一个【BotContext】完成【状态切换】： */
public class BotContext {
	private State state = new DisconnectedState();

	public String chat(String input) {
		
		if ("hello".equalsIgnoreCase(input)) { 
		// 收到 hello 切换到 Connected
			state = new ConnectedState(); 
			return state.init();
		} else if ("bye".equalsIgnoreCase(input)) {
		// 收到 bye 切换到 Disconnected
			state = new DisconnectedState(); 
			return state.init();
		} else {
			return state.reply(input); // state.reply()
		}
	
	}
}


/*
这样，一个价值千万的【AI聊天机器人】就诞生了： */
Scanner scanner = new Scanner(System.in);
BotContext bot = new BotContext();

for(;;) {
	System.out.print(">");

	String input = scanner.nextLine();
	String output = bot.chat(input);

	System.out.println(output.isEmpty() ? "(no reply)" : "<" + output);
}


/*
试试效果： 

> hello
< Hello, I'm Bob.
> Nice to meet you.
< Nice to meet you!
> Today is cold?
< Yes. Today is cold!
> bye
< Bye!


================================================

#	练习

新增BusyState状态表示忙碌  */



/*============================================

#	----- 状态 の 小结 -----


1. 【状态模式的设计思想】是把【不同状态的逻辑】分离到【不同的状态类】中，从而使得【增加新状态】更容易；

2. 【状态模式的实现】关键在于状态转换。【简单的状态转换】可以直接由【调用方】指定，【复杂的状态转换】可以在【内部】根据条件【触发完成】。





*/


























